package cn.doyens.reggie.service.impl;

import cn.doyens.reggie.common.CustomException;
import cn.doyens.reggie.dto.SetmealDto;
import cn.doyens.reggie.entity.Setmeal;
import cn.doyens.reggie.entity.SetmealDish;
import cn.doyens.reggie.mapper.SetmealMapper;
import cn.doyens.reggie.service.SetmealDishService;
import cn.doyens.reggie.service.SetmealService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {


    @Autowired
    private SetmealDishService setmealDishService;


    /**
     *    1. 直接通过 SetmealService调用方法 将 套餐信息 添加到 setmeal表中 获取新增套餐的id
     *    2. 取出setmealDto中包含的 setmealDishs集合  setmealDishList
     *    3. 遍历setmealDishList集合  在遍历过程中 为每一个 setmealDish对象 设置 setmealId
     *    4. 遍历结束后 将修改过后的 setmealDishList对象 通过 setmealDishService调用 saveBatch方法实现批量添加
     * @param setmealDto
     */
    @Override
    @Transactional
    public void saveSetmealWithSetmealDish(SetmealDto setmealDto) {
        //1. 直接通过 SetmealService调用方法 将 套餐信息 添加到 setmeal表中 获取新增套餐的id
        this.save(setmealDto);
        //2. 取出setmealDto中包含的 setmealDishs集合  setmealDishList
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        //3. 遍历setmealDishList集合  在遍历过程中 为每一个 setmealDish对象 设置 setmealId
        List<SetmealDish> newSetmealDishList = setmealDishes.stream().map(setmealDish -> {
            //将新增套餐id 赋值给 setmealDish对象
            setmealDish.setSetmealId(setmealDto.getId());
            return setmealDish;
        }).collect(Collectors.toList());
        //4. 遍历结束后 将修改过后的 setmealDishList对象 通过 setmealDishService调用 saveBatch方法实现批量添加
        this.setmealDishService.saveBatch(newSetmealDishList);
    }

    /**
     *   在服务端的逻辑中, 删除套餐时, 我们不仅要删除套餐, 还要删除套餐与菜品的关联关系。
     *
     *   分析:
     *       1.  查询要删除的套餐的状态启用的个数
     *       2.  如果大于0 则提示 用户无法删除 手动抛出异常
     *       3.   通过setmealService调用方法 将符合条件的 套餐进行删除处理
     *       4.   通过setmealDishService 调用方法 将指定setmealid的 条目删除
     * @param ids
     */
    @Override
    public void deleteSetmeal(List<Long> ids) {
        // 1.  查询要删除的套餐的状态启用的个数
        QueryWrapper<Setmeal> setmealQueryWrapper = new QueryWrapper<>();
        setmealQueryWrapper.in("id",ids);
        setmealQueryWrapper.eq("status",1);
        //通过 setmealService调用count方法 获取符合条件的条目数量值
        int count = this.count(setmealQueryWrapper);
        // 2.  如果大于0 则提示 用户无法删除 手动抛出异常
        if(count>0){
            throw new CustomException(" 无法删除套餐 套餐正在售卖");
        }
        //3. 通过setmealService调用方法 将符合条件的 套餐进行删除处理
        this.removeByIds(ids);
        // 4.   通过setmealDishService 调用方法 将指定setmealid的 条目删除
        QueryWrapper<SetmealDish> setmealDishQueryWrapper = new QueryWrapper<>();
        setmealDishQueryWrapper.in("setmeal_id",ids);

        this.setmealDishService.remove(setmealDishQueryWrapper);
    }
}
